package contratosonline.ejb.controller;


import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;

import contratosonline.entity.Contrato;
import contratosonline.entity.FiscalContrato;
import contratosonline.entity.LicitacaoOrigem;
import contratosonline.entity.TermoAditivo;

import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author admin
 */
@Stateless
public class ContratoJPAController implements ContratoJPAControllerLocal {
	@PersistenceContext
	private EntityManager em;
	
	 public EntityManager getEntityManager() {
	        return em;
	    }
	 
	 public ContratoJPAController(){  
	 }
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#persiste(contratosonline.entity.Contrato)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#persiste(contratosonline.entity.Contrato)
	 */
    public void persiste(Contrato contrato) {
        if (contrato.getTermoaditivoCollection() == null) {
            contrato.setTermoaditivoCollection(new ArrayList<TermoAditivo>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            FiscalContrato fiscal = contrato.getFiscal();
            if (fiscal != null) {
                fiscal = em.getReference(fiscal.getClass(), fiscal.getIdFiscalContrato());
                contrato.setFiscal(fiscal);
            }
            LicitacaoOrigem licitacaoOrigem = contrato.getLicitacaoOrigem();
            if (licitacaoOrigem != null) {
                licitacaoOrigem = em.getReference(licitacaoOrigem.getClass(), licitacaoOrigem.getIdlicitacaoOrigem());
                contrato.setLicitacaoOrigem(licitacaoOrigem);
            }
            Collection<TermoAditivo> attachedTermoaditivoCollection = new ArrayList<TermoAditivo>();
            for (TermoAditivo termoaditivoCollectionTermoaditivoToAttach : contrato.getTermoaditivoCollection()) {
                termoaditivoCollectionTermoaditivoToAttach = em.getReference(termoaditivoCollectionTermoaditivoToAttach.getClass(), termoaditivoCollectionTermoaditivoToAttach.getIdTermoAditivo());
                attachedTermoaditivoCollection.add(termoaditivoCollectionTermoaditivoToAttach);
            }
            contrato.setTermoaditivoCollection(attachedTermoaditivoCollection);
            em.persist(contrato);
            if (fiscal != null) {
                fiscal.getContratoCollection().add(contrato);
                fiscal = em.merge(fiscal);
            }
            if (licitacaoOrigem != null) {
                licitacaoOrigem.getContratoCollection().add(contrato);
                licitacaoOrigem = em.merge(licitacaoOrigem);
            }
            for (TermoAditivo termoaditivoCollectionTermoaditivo : contrato.getTermoaditivoCollection()) {
                Contrato oldContratoOfTermoaditivoCollectionTermoaditivo = termoaditivoCollectionTermoaditivo.getContrato();
                termoaditivoCollectionTermoaditivo.setContrato(contrato);
                termoaditivoCollectionTermoaditivo = em.merge(termoaditivoCollectionTermoaditivo);
                if (oldContratoOfTermoaditivoCollectionTermoaditivo != null) {
                    oldContratoOfTermoaditivoCollectionTermoaditivo.getTermoaditivoCollection().remove(termoaditivoCollectionTermoaditivo);
                    oldContratoOfTermoaditivoCollectionTermoaditivo = em.merge(oldContratoOfTermoaditivoCollectionTermoaditivo);
                }
            }
        } finally {
            if (em != null) {
               // em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#altera(contratosonline.entity.Contrato)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#altera(contratosonline.entity.Contrato)
	 */
    public void altera(Contrato contrato) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Contrato persistentContrato = em.find(Contrato.class, contrato.getIdcontrato());
            FiscalContrato fiscalOld = persistentContrato.getFiscal();
            FiscalContrato fiscalNew = contrato.getFiscal();
            LicitacaoOrigem licitacaoOrigemOld = persistentContrato.getLicitacaoOrigem();
            LicitacaoOrigem licitacaoOrigemNew = contrato.getLicitacaoOrigem();
            Collection<TermoAditivo> termoaditivoCollectionOld = persistentContrato.getTermoaditivoCollection();
            Collection<TermoAditivo> termoaditivoCollectionNew = contrato.getTermoaditivoCollection();
            if (fiscalNew != null) {
                fiscalNew = em.getReference(fiscalNew.getClass(), fiscalNew.getIdFiscalContrato());
                contrato.setFiscal(fiscalNew);
            }
            if (licitacaoOrigemNew != null) {
                licitacaoOrigemNew = em.getReference(licitacaoOrigemNew.getClass(), licitacaoOrigemNew.getIdlicitacaoOrigem());
                contrato.setLicitacaoOrigem(licitacaoOrigemNew);
            }
            Collection<TermoAditivo> attachedTermoaditivoCollectionNew = new ArrayList<TermoAditivo>();
            for (TermoAditivo termoaditivoCollectionNewTermoaditivoToAttach : termoaditivoCollectionNew) {
                termoaditivoCollectionNewTermoaditivoToAttach = em.getReference(termoaditivoCollectionNewTermoaditivoToAttach.getClass(), termoaditivoCollectionNewTermoaditivoToAttach.getIdTermoAditivo());
                attachedTermoaditivoCollectionNew.add(termoaditivoCollectionNewTermoaditivoToAttach);
            }
            termoaditivoCollectionNew = attachedTermoaditivoCollectionNew;
            contrato.setTermoaditivoCollection(termoaditivoCollectionNew);
            contrato = em.merge(contrato);
            if (fiscalOld != null && !fiscalOld.equals(fiscalNew)) {
                fiscalOld.getContratoCollection().remove(contrato);
                fiscalOld = em.merge(fiscalOld);
            }
            if (fiscalNew != null && !fiscalNew.equals(fiscalOld)) {
                fiscalNew.getContratoCollection().add(contrato);
                fiscalNew = em.merge(fiscalNew);
            }
            if (licitacaoOrigemOld != null && !licitacaoOrigemOld.equals(licitacaoOrigemNew)) {
                licitacaoOrigemOld.getContratoCollection().remove(contrato);
                licitacaoOrigemOld = em.merge(licitacaoOrigemOld);
            }
            if (licitacaoOrigemNew != null && !licitacaoOrigemNew.equals(licitacaoOrigemOld)) {
                licitacaoOrigemNew.getContratoCollection().add(contrato);
                licitacaoOrigemNew = em.merge(licitacaoOrigemNew);
            }
            for (TermoAditivo termoaditivoCollectionOldTermoaditivo : termoaditivoCollectionOld) {
                if (!termoaditivoCollectionNew.contains(termoaditivoCollectionOldTermoaditivo)) {
                    termoaditivoCollectionOldTermoaditivo.setContrato(null);
                    termoaditivoCollectionOldTermoaditivo = em.merge(termoaditivoCollectionOldTermoaditivo);
                }
            }
            for (TermoAditivo termoaditivoCollectionNewTermoaditivo : termoaditivoCollectionNew) {
                if (!termoaditivoCollectionOld.contains(termoaditivoCollectionNewTermoaditivo)) {
                    Contrato oldContratoOfTermoaditivoCollectionNewTermoaditivo = termoaditivoCollectionNewTermoaditivo.getContrato();
                    termoaditivoCollectionNewTermoaditivo.setContrato(contrato);
                    termoaditivoCollectionNewTermoaditivo = em.merge(termoaditivoCollectionNewTermoaditivo);
                    if (oldContratoOfTermoaditivoCollectionNewTermoaditivo != null && !oldContratoOfTermoaditivoCollectionNewTermoaditivo.equals(contrato)) {
                        oldContratoOfTermoaditivoCollectionNewTermoaditivo.getTermoaditivoCollection().remove(termoaditivoCollectionNewTermoaditivo);
                        oldContratoOfTermoaditivoCollectionNewTermoaditivo = em.merge(oldContratoOfTermoaditivoCollectionNewTermoaditivo);
                    }
                }
            }
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = contrato.getIdcontrato();
                if (findContrato(id) == null) {
                    throw new Exception("The contrato with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                //em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#exclui(java.lang.Integer)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#exclui(java.lang.Integer)
	 */
    public void exclui(Integer id) throws Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            Contrato contrato;
            try {
                contrato = em.getReference(Contrato.class, id);
                contrato.getIdcontrato();
            } catch (EntityNotFoundException enfe) {
                throw new Exception("The contrato with id " + id + " no longer exists.", enfe);
            }
            FiscalContrato fiscal = contrato.getFiscal();
            if (fiscal != null) {
                fiscal.getContratoCollection().remove(contrato);
                fiscal = em.merge(fiscal);
            }
            LicitacaoOrigem licitacaoOrigem = contrato.getLicitacaoOrigem();
            if (licitacaoOrigem != null) {
                licitacaoOrigem.getContratoCollection().remove(contrato);
                licitacaoOrigem = em.merge(licitacaoOrigem);
            }
            Collection<TermoAditivo> termoaditivoCollection = contrato.getTermoaditivoCollection();
            for (TermoAditivo termoaditivoCollectionTermoaditivo : termoaditivoCollection) {
                termoaditivoCollectionTermoaditivo.setContrato(null);
                termoaditivoCollectionTermoaditivo = em.merge(termoaditivoCollectionTermoaditivo);
            }
            em.remove(contrato);
        } finally {
            if (em != null) {
               // em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#findContratoEntities()
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#findContratoEntities()
	 */
    public List<Contrato> findContratoEntities() {
        return findContratoEntities(true, -1, -1);
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#findContratoEntities(int, int)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#findContratoEntities(int, int)
	 */
    public List<Contrato> findContratoEntities(int maxResults, int firstResult) {
        return findContratoEntities(false, maxResults, firstResult);
    }

    @SuppressWarnings("unchecked")
	private List<Contrato> findContratoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Contrato as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            //em.close();
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#findContrato(java.lang.Integer)
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#findContrato(java.lang.Integer)
	 */
    public Contrato findContrato(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Contrato.class, id);
        } finally {
           // em.close();
        }
    }

    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoControllerLocal#getContratoCount()
	 */
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#getContratoCount()
	 */
    public int getContratoCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Contrato as o").getSingleResult()).intValue();
        } finally {
            //em.close();
        }
    }
    
    /* (non-Javadoc)
	 * @see contratosonline.ejb.controller.ContratoJPAControllerLocal#findContratoByNumeroAno(java.lang.String, java.lang.String)
	 */
    @SuppressWarnings("unchecked")
	public List<Contrato> findContratoByNumeroAno(String num, String ano) {
        EntityManager em = getEntityManager();
        try {
        	 Query q = em.createNamedQuery("Contrato.findByContratoNumeroAno");
        	 q.setParameter("contratoNumero", num);
        	 q.setParameter("contratoAno", ano);
             
             return q.getResultList();
        } finally {
            //em.close();
        }
    }

}

